package com.zyj.utils.maths;

/**
 * 行列式工具类
 */
public class DeterminantUtils {

    // det用于求行列式

    /**
     * 计算矩阵的行列式
     * @param a
     * @return
     */
    static double calDet(double[][] a) {
        if (a.length == 1) {
            return a[0][0];
        } else {
            double ans=0;
            for (int i = 0; i < a.length; i++) {
                ans+=a[i][0] * Math.pow(-1, i) * calDet(complementMinor(a,i+1,1));
            }
            return ans;
        }
    }

    /**
     * 求余子阵
     * @param a
     * @param row
     * @param column
     * @return
     */
    static double[][] complementMinor(double[][] a, int row, int column) {
        double[][] ans = new double[a.length - 1][a.length - 1];	// ans用于储存返回的最终结果
        double[] temp = new double[(a.length - 1) * (a.length - 1)];	// 临时一维数组temp用于按顺序储存剔除相应行和列元素后的数组
        int k = 0;
        // 剔除行和列并按顺序储存到temp内
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[i].length; j++) {
                if (i == row - 1) {
                    continue;
                } else if (j == column - 1) {
                    continue;
                }
                temp[k++] = a[i][j];
            }
        }
        // 按顺序从temp中读取数据并储存到ans内
        k = 0;
        for (int i = 0; i < ans.length; i++) {
            for (int j = 0; j < ans[i].length; j++) {
                ans[i][j] = temp[k++];
            }
        }
        return ans;
    }
}
